package com.agencia.jsf;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.faces.component.html.HtmlDataTable;
import javax.faces.component.html.HtmlInputHidden;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpServletRequest;

import agencia.Hotel;
import agencia.ReservaHotelPaquete;
import agencia.exceptions.RangosFechasException;
import agencia.persistencia.HotelDAO;
	
public class AdministrarReservasHotelBean {
	
	private HtmlDataTable 		dataTable;
    private ReservaHotelPaquete	dataItem = new ReservaHotelPaquete();
    private HtmlInputHidden 	dataItemId = new HtmlInputHidden();
    private HtmlInputHidden 	dataItemIdPaquete = new HtmlInputHidden();
    private HtmlInputHidden		dataItemCategoria = new HtmlInputHidden();
	private List<ReservaHotelPaquete> 		reservas = new ArrayList<ReservaHotelPaquete>();;
	private List<SelectItem>	hoteles;
	private int 				cantidad = 0;
	private int 				proximoId= 1;
	private Long				idPaquete;
	private int					categoria;
	
	
	public int getCategoria() {
		return categoria;
	}


	public void setCategoria(int categoria) {
		this.categoria = categoria;
	}


	public AdministrarReservasHotelBean() throws RangosFechasException {
		traerRequest();
		cargar();
	}
	
	
	@SuppressWarnings({ "unchecked", "deprecation" })
	private void cargar() throws RangosFechasException{
		
		Date checkIn = new Date("03/12/08");
		Date checkOut = new Date("06/12/08");
		List<Hotel> listaHoteles = new ArrayList<Hotel>();
		
		if (reservas.isEmpty()){			
			Hotel hotel = new Hotel("Hilton"," sanJuan3276", "argentina"," caba", "8887", 5);
			ReservaHotelPaquete hotelPaquete = new ReservaHotelPaquete();
			hotelPaquete.setId(Long.valueOf(1));
			hotelPaquete.setHotel(hotel);
			hotelPaquete.setNombreHotel(hotel.getNombre());
			hotelPaquete.setCheckIn(checkIn);
			hotelPaquete.setCheckOut(checkOut);
			
			reservas.add(hotelPaquete);
			cantidad++;
			actualizarProximoId();
		}
				
		HotelDAO hotelDAO = new HotelDAO();
		
		listaHoteles =  hotelDAO.findByCategoria(dataItemCategoria.getValue());		
		
		Iterator<Hotel> it = listaHoteles.iterator();
		hoteles = new ArrayList<SelectItem>();
		
		while(it.hasNext()){
			hoteles.add(new SelectItem(it.next()));
		}		
				
		/*
		 * traer de la bd todas las reservas de hoteles cuyo idPaquete sea igual a idPaquete
		 */
		
	}
	
	public void actualizarProximoId(){
		proximoId++;		
	}
	
	public int getProximoId(){
		return proximoId;
	}
	
	public String crear() {
		dataItem = new ReservaHotelPaquete();

		cantidad++;
		dataItemId.setValue(new Long(cantidad));
		
		return "editar";
	}

	public String editar() {
		// Obtengo la fila completa
	    dataItem = (ReservaHotelPaquete) dataTable.getRowData();
	    dataItemId.setValue(dataItem.getId());
	
		return "editar";
	}
	
	private void persistirReserva(){

	}
	
	public String guardar() {
		
		dataItem.setId(Long.valueOf(dataItemId.getValue().toString()));
		if (cantidad > reservas.size()){
			dataItem.setId(Long.valueOf(getProximoId()));
			persistirReserva();
			reservas.add(dataItem);
			actualizarProximoId();
		}
		
		return "listar";
	}
	
	public String eliminar(){
		dataItem = (ReservaHotelPaquete) dataTable.getRowData();
		eliminarReserva();
		reservas.remove(dataItem);
		cantidad--;
		return "listar";
	}
	
	private void eliminarReserva(){

	}
	
	public String listar() {
		return null;
	}
	
	
	
	public String volver() {		
		// Si se creo uno nuevo, vuelvo el conteo hacia atras
		cantidad = reservas.size();

		return "volver";
	}
	
	public void traerRequest(){
		
		FacesContext context = FacesContext.getCurrentInstance();		
		HttpServletRequest request= (HttpServletRequest)context.getExternalContext().getRequest();
		Long idPaquete 	= (Long)request.getSession().getAttribute("idPaquete");
		Long aux  		= (Long)request.getSession().getAttribute("categoria");
	
		setIdPaquete(idPaquete);
		setCategoria(aux.intValue());
		
		dataItemIdPaquete.setValue(new Long(getIdPaquete()));
		dataItemCategoria.setValue(aux.intValue());
		
	}

	//-------------------------------------
	
	public HtmlDataTable getDataTable() {
		return dataTable;
	}

	public void setDataTable(HtmlDataTable dataTable) {
		this.dataTable = dataTable;
	}

	public ReservaHotelPaquete getDataItem() {
		return dataItem;
	}

	public void setDataItem(ReservaHotelPaquete dataItem) {
		this.dataItem = dataItem;
	}

	public HtmlInputHidden getDataItemId() {
		return dataItemId;
	}

	public void setDataItemId(HtmlInputHidden dataItemId) {
		this.dataItemId = dataItemId;
	}

	public int getCantidad() {
		return cantidad;
	}

	public void setCantidad(int cantidad) {
		this.cantidad = cantidad;
	}

	public List<ReservaHotelPaquete> getReservas() throws RangosFechasException {
		traerRequest();
		cargar();
		return reservas;
	}

	public void setReservas(List<ReservaHotelPaquete> reservas) {
		this.reservas = reservas;
	}


	public HtmlInputHidden getDataItemIdPaquete() {
		return dataItemIdPaquete;
	}


	public void setDataItemIdPaquete(HtmlInputHidden dataItemIdPaquete) {
		this.dataItemIdPaquete = dataItemIdPaquete;
	}


	public Long getIdPaquete() {
		return idPaquete;
	}


	public void setIdPaquete(Long idPaquete) {
		this.idPaquete = idPaquete;
	}


	public List<SelectItem> getHoteles() {
		return hoteles;
	}


	public void setHoteles(List<SelectItem> hoteles) {
		this.hoteles = hoteles;
	}


	public HtmlInputHidden getDataItemCategoria() {
		return dataItemCategoria;
	}


	public void setDataItemCategoria(HtmlInputHidden dataItemCategoria) {
		this.dataItemCategoria = dataItemCategoria;
	}
}
